package com.zhoujian.creational;

/**
 * 懒汉式单例的实现
 * @author 周健
 * @creatTime 2023-09-04
 */
public class LazySingleton {

    /**
     * 编写单例代码时注意以下四点：
     * 1.构造器需要私有化
     * 2.暴露一个公共获取单例对象的接口
     * 3.是否支持懒加载（延迟加载）
     * 4.是否线程安全
     */

    //1.持有一个jvm全局唯一的实例
    private static LazySingleton instance;

    //2.为了避免别人随意的创建，我们需要私有化构造器
    private LazySingleton(){}

    //3.暴露一个方法，用来获取实例
    public static LazySingleton getInstance() {
        if(instance == null){//当有很多线程来获取这个单例的时候，可能同一时间进行if判断，由于先前没有线程创建这个实例
            //所以就有多个线程使用new方法，导致jvm中有多余的实例，不满足单例。就会导致线程安全问题。
            instance = new LazySingleton();
        }

        return instance;
    }
}

//那么如何解决线程不安全问题呢？？
/**
 * 1.使用synchronize关键字，会导致性能方面的问题
 * public synchronize static LazySingleton getInstance() {
 *         项目代码
 *         }
 *  2.使用双重检查锁代码鉴于DoublecheckSingleton.java
 */